<?php
//include "IfGbook.class.php";
class GbMySql {
	
	private $_db; 		// Хэндл соединения MySqli
	private $_edit; 	// Используется для обеспечения возврата на форму редактирования поста, в случае его "пустоты" 

	/*
	* Конструктор объекта класса Гостевой книги с обменом данными с MySql
 	*/
	public function __construct() {
		$dbconf = parse_ini_file("db_config.ini") or die("Проверьте наличие и состояние файла db_config.ini");
		define ("DB_NAME", $dbconf["db"]);
		define ("DB_HOST", $dbconf["host"]);
		define ("DB_USER", $dbconf["user"]);
		define ("DB_PASS", $dbconf["password"]);
	
		$this->_db = new mysqli(DB_HOST, DB_USER, DB_PASS);

		if ($this->_db->connect_errno) {
    		echo "Не могу подключиться к MySQLi: (" . $this->_db->connect_errno . ") " . $this->_db->connect_error;
		}
	/*
	* Создание базы данных и двух таблиц MySql
 	*/
		$sql = "CREATE DATABASE IF NOT EXISTS ". DB_NAME. " CHARACTER SET utf8 COLLATE utf8_general_ci";

		$result = $this->queryHandle($sql);

		$sql = "USE ". DB_NAME;

		$result = $this->queryHandle($sql);
		
		$sql = "SET NAMES utf8". DB_NAME;

		$result = $this->queryHandle($sql);
						
		$sql = "CREATE TABLE IF NOT EXISTS gb_messages (
					id INT(11) NOT NULL auto_increment,
					PRIMARY KEY (id),
					name TEXT NOT NULL,
					post TEXT,
					datetime INT(11))";
				
		$result = $this->queryHandle($sql);
		
		$sql = "CREATE TABLE IF NOT EXISTS gb_comments (
					id INT(11) NOT NULL auto_increment,
					PRIMARY KEY (id),
					name TEXT NOT NULL,
					comment TEXT,
					pid INT(11) NOT NULL,
					datetime INT(11))"; 

		$result = $this->queryHandle($sql);

	}
	/*
	* Деструктор объекта класса Гостевой книги с обменом данными с MySql
 	*/
	public function __destruct(){
		$this->_db = NULL;

	}
	/*
	* Метод сохранения сообщения(поста)
 	*/
	public function postSave($name, $post) {
		$name = $this->_db->real_escape_string($name);
		$post = $this->_db->real_escape_string($post);
			
			$dt = time();
			$sql = "INSERT INTO gb_messages(
							name,
							post,
							datetime
						) VALUES (
							'$name',
							'$post',
							$dt)";
			return $this->queryHandle($sql);
		 
	}
	/*
	* Метод редактирования поста
 	*/
	public function postUpdate($id, $post) {
		$post = $this->_db->real_escape_string($post);
	
				$sql = "UPDATE gb_messages SET
							post = '$post'
						WHERE
							id = $id";
			return $this->queryHandle($sql);
	}
	/*
	* Метод получения всех постов
 	*/
	public function getAllPosts() {
		$sql = "SELECT id, name, post, datetime FROM gb_messages ORDER BY id DESC";

		return $this->obj2Array($this->queryHandle($sql));

	}
	/*
	* Метод получения одного поста для построения комментариев
 	*/
	public function getPost($id) {
		$sql = "SELECT name, post, datetime FROM gb_messages WHERE id = $id";

		return $this->obj2Array($this->queryHandle($sql));

	}
	/*
	* Метод получения всех комментариев к выбранному посту
 	*/
	public function getAllComments($pid) {
		$sql = "SELECT id, name, comment, datetime FROM gb_comments WHERE pid = $pid ORDER BY id";

		return $this->obj2Array($this->queryHandle($sql));

	}
	/*
	* Метод удаления поста
 	*/
	public function postDelete($id){
		$sql = "DELETE FROM gb_messages WHERE id = $id";
		
		return $this->queryHandle($sql);
	}
	/*
	* Метод выбора поста из БД для его редактирования
 	*/
	public function postEdit($id) {
		$sql = "SELECT post FROM gb_messages WHERE id = $id";
		
		return $this->obj2Array($this->queryHandle($sql));
	}
	/*
	* Метод добавления комментария к посту
 	*/
	public function commentAdd($name, $comment, $pid) {
		$name = $this->_db->real_escape_string($name);
		$comment = $this->_db->real_escape_string($comment);
		$pid = $pid*1;
			
			$dt = time();
			$sql = "INSERT INTO gb_comments(
							name,
							comment,
							pid,
							datetime
						) VALUES (
							'$name',
							'$comment',
							$pid,
							$dt)";
			return $this->queryHandle($sql);

	}
	/*
	* Метод удаления комментариев к посту.
	* Допускает удаление выбранного комментария или всех комментариев к заданному посту
 	*/
	public function commentRemove($id, $pid=0) {
		if (!$pid)		
			$sql = "DELETE FROM gb_comments WHERE id = $id";
		else
			$sql = "DELETE FROM gb_comments WHERE pid = $pid";
		
		return $this->queryHandle($sql);
	}
	/*
	* Стандартная функция для обработки запросов MySql
 	*/
	protected function queryHandle($qry) {
		$res = $this->_db->query($qry);
			if (!$res) 
				return "Запрос возвратил ошибку: (" . $this->_db->errno . ") " . $this->_db->error;
			else
				return $res;
	}
	/*
	* Функция преобразования объекта, получаемого как результат запросов "SELECT", в массив
 	*/
	public function obj2Array($obj) {
		if(is_object($obj))	{
			$res = array();
			while($row = $obj->fetch_assoc()){
				$res[] = $row;
			}
			return $res;
		}
		return false;
	}
	/*
	* Функция записи идентификатора поста из последнего GET-запроса на редактирование.
	* Используется для возврата на форму редактирования поста, в случае ошибочной очистки всего текста поста.
 	*/
	public function setLastEdit($id) {
		$this->_edit = $id;
	}	
	/*
	* Функция получения идентификатора поста из последнего GET-запроса на редактирование.
	* Используется для возврата на форму редактирования поста, в случае ошибочной очистки всего текста поста.
 	*/
	public function getLastEdit() {
		return $this->_edit;
	}

}

?>
